# Please install OpenAI SDK first: `pip3 install openai`

from openai import OpenAI
from fastapi import FastAPI, Query,applications
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.responses import RedirectResponse
from fastapi.responses import FileResponse
from pydantic import BaseModel
from typing import List
from lgc.chat_round import chatRound
from config import client, modelName, Message


def swagger_monkey_patch(*args, **kwargs):
    return get_swagger_ui_html(
        *args,
        **kwargs,
        swagger_js_url="/static/swagger/swagger-ui-bundle.js",
        swagger_css_url="/static/swagger/swagger-ui.css"
    )


applications.get_swagger_ui_html = swagger_monkey_patch

app = FastAPI()

# 挂载静态文件目录
app.mount("/static", StaticFiles(directory="static"), name="static")

client = OpenAI(
    api_key="ff434215ab8441a38b58c8ae700c0d50.YyJd8MOu6sAsWaH2",
    base_url="https://open.bigmodel.cn/api/paas/v4/",
)

modelName = "glm-4-plus"; ## glm-4-plus  deepseek-reasoner  /   deepseek-chat




# 添加根路径重定向，不再swagger中显示
@app.get("/", include_in_schema=False)
async def redirect_to_docs():
    return RedirectResponse(url="/hello")

@app.post("/getSQLMultiRound")
async def get_sql_multi_round(messages: List[Message]):
    """
    根据输入的消息列表，调用大模型生成 SQL 语句。
    
    Args:
        List[Message]: 一个包含消息对象的列表，每个消息对象包含 `role` 和 `content` 两个属性。
        
            `role` (str): 消息的角色，例如 "system", "user", "assistant" 等。
            User(用户)：代表与模型交互的用户，通常用于输入问题或指令。            
            System(系统)：用于设定对话的背景、规则或模型的行为框架，通常在对话开始前定义一次，为整个交互提供上下文。
            Assistant(助手)：代表模型本身，用于生成回答或执行任务，表示由大模型生成的内容。
            
            `content` (str): 消息的具体内容。
            
    Returns:
        {"sql": string, "message": string}
        
            `sql` (str): 生成的 SQL 语句。
            `message` (dict): 大模型返回的完整消息对象，用于下一轮对话带回。
    """
    completion = client.chat.completions.create(
        model=modelName,  ##  deepseek-reasoner  /   deepseek-chat
        messages=messages,
        temperature=0,
        stream=False,
    )
    res = completion.choices[0].message.content
    return {"sql": res, "message": completion.choices[0].message}

@app.get("/fanyi")
async def fanyi(text: str):
    """
    翻译，自动判断翻译的方向
    """
    messages: List[Message] = [
        {"role": "system", "content": "你是一个世界级的翻译专家，请翻译用户输入的完整内容，翻译在汉语和英语之间进行，根据用户输入的内容，自动判断翻译的方向，不要添加多余的标点符号"},
        {"role": "user", "content": text},
    ]
    completion = client.chat.completions.create(
        model=modelName,  
        messages=messages,
        temperature=0,
        stream=False,
    )
    res = completion.choices[0].message.content
    return res;


@app.post("/chatRound")
async def doChatRound(messages: List[Message]):    
    print(f"chatRound: {messages}")
    return chatRound(messages)


@app.get("/hello")
async def show_hello_page():
    return FileResponse("static/hello.html")


# 添加跨域中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=['*'],  # 允许所有源
    allow_credentials=True,
    allow_methods=['*'],  # 允许所有方法
    allow_headers=['*'],  # 允许所有头
)
